{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 机器学习纳米学位\n",
    "## 监督学习\n",
    "## 项目2: 为*CharityML*寻找捐献者"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "欢迎来到机器学习工程师纳米学位的第二个项目！在此文件中，有些示例代码已经提供给你，但你还需要实现更多的功能让项目成功运行。除非有明确要求，你无须修改任何已给出的代码。以**'练习'**开始的标题表示接下来的代码部分中有你必须要实现的功能。每一部分都会有详细的指导，需要实现的部分也会在注释中以'TODO'标出。请仔细阅读所有的提示！\n",
    "\n",
    "除了实现代码外，你还必须回答一些与项目和你的实现有关的问题。每一个需要你回答的问题都会以**'问题 X'**为标题。请仔细阅读每个问题，并且在问题后的**'回答'**文字框中写出完整的答案。我们将根据你对问题的回答和撰写代码所实现的功能来对你提交的项目进行评分。\n",
    ">**提示：**Code 和 Markdown 区域可通过**Shift + Enter**快捷键运行。此外，Markdown可以通过双击进入编辑模式。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 开始\n",
    "\n",
    "在这个项目中，你将使用1994年美国人口普查收集的数据，选用几个监督学习算法以准确地建模被调查者的收入。然后，你将根据初步结果从中选择出最佳的候选算法，并进一步优化该算法以最好地建模这些数据。你的目标是建立一个能够准确地预测被调查者年收入是否超过50000美元的模型。这种类型的任务会出现在那些依赖于捐款而存在的非营利性组织。了解人群的收入情况可以帮助一个非营利性的机构更好地了解他们要多大的捐赠，或是否他们应该接触这些人。虽然我们很难直接从公开的资源中推断出一个人的一般收入阶层，但是我们可以（也正是我们将要做的）从其他的一些公开的可获得的资源中获得一些特征从而推断出该值。\n",
    "\n",
    "这个项目的数据集来自[UCI机器学习知识库](https://archive.ics.uci.edu/ml/datasets/Census+Income)。这个数据集是由Ron Kohavi和Barry Becker在发表文章_\"Scaling Up the Accuracy of Naive-Bayes Classifiers: A Decision-Tree Hybrid\"_之后捐赠的，你可以在Ron Kohavi提供的[在线版本](https://www.aaai.org/Papers/KDD/1996/KDD96-033.pdf)中找到这个文章。我们在这里探索的数据集相比于原有的数据集有一些小小的改变，比如说移除了特征`'fnlwgt'` 以及一些遗失的或者是格式不正确的记录。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "----\n",
    "## 探索数据\n",
    "运行下面的代码单元以载入需要的Python库并导入人口普查数据。注意数据集的最后一列`'income'`将是我们需要预测的列（表示被调查者的年收入会大于或者是最多50,000美元），人口普查数据中的每一列都将是关于被调查者的特征。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 检查你的Python版本\n",
    "from sys import version_info\n",
    "if version_info.major != 2 and version_info.minor != 7:\n",
    "    raise Exception('请使用Python 2.7来完成此项目')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>age</th>\n",
       "      <th>workclass</th>\n",
       "      <th>education_level</th>\n",
       "      <th>education-num</th>\n",
       "      <th>marital-status</th>\n",
       "      <th>occupation</th>\n",
       "      <th>relationship</th>\n",
       "      <th>race</th>\n",
       "      <th>sex</th>\n",
       "      <th>capital-gain</th>\n",
       "      <th>capital-loss</th>\n",
       "      <th>hours-per-week</th>\n",
       "      <th>native-country</th>\n",
       "      <th>income</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>39</td>\n",
       "      <td>State-gov</td>\n",
       "      <td>Bachelors</td>\n",
       "      <td>13.0</td>\n",
       "      <td>Never-married</td>\n",
       "      <td>Adm-clerical</td>\n",
       "      <td>Not-in-family</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>2174.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>40.0</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   age   workclass education_level  education-num  marital-status  \\\n",
       "0   39   State-gov       Bachelors           13.0   Never-married   \n",
       "\n",
       "      occupation    relationship    race    sex  capital-gain  capital-loss  \\\n",
       "0   Adm-clerical   Not-in-family   White   Male        2174.0           0.0   \n",
       "\n",
       "   hours-per-week  native-country income  \n",
       "0            40.0   United-States  <=50K  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 为这个项目导入需要的库\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "from time import time\n",
    "from IPython.display import display # 允许为DataFrame使用display()\n",
    "\n",
    "# 导入附加的可视化代码visuals.py\n",
    "import visuals as vs\n",
    "\n",
    "# 为notebook提供更加漂亮的可视化\n",
    "%matplotlib inline\n",
    "\n",
    "# 导入人口普查数据\n",
    "data = pd.read_csv(\"census.csv\")\n",
    "\n",
    "# 成功 - 显示第一条记录\n",
    "display(data.head(n=1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 练习：数据探索\n",
    "首先我们对数据集进行一个粗略的探索，我们将看看每一个类别里会有多少被调查者？并且告诉我们这些里面多大比例是年收入大于50,000美元的。在下面的代码单元中，你将需要计算以下量：\n",
    "\n",
    "- 总的记录数量，`'n_records'`\n",
    "- 年收入大于50,000美元的人数，`'n_greater_50k'`.\n",
    "- 年收入最多为50,000美元的人数 `'n_at_most_50k'`.\n",
    "- 年收入大于50,000美元的人所占的比例， `'greater_percent'`.\n",
    "\n",
    "**提示：** 您可能需要查看上面的生成的表，以了解`'income'`条目的格式是什么样的。 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Total number of records: 45222\n",
      "Individuals making more than $50,000: 34014\n",
      "Individuals making at most $50,000: 11208\n",
      "Percentage of individuals making more than $50,000: 24.78%\n"
     ]
    }
   ],
   "source": [
    "# TODO：总的记录数\n",
    "n_records = len(data)\n",
    "\n",
    "# TODO：被调查者的收入大于$50,000的人数\n",
    "n_greater_50k = len(data[data['income']=='<=50K'])\n",
    "\n",
    "# TODO：被调查者的收入最多为$50,000的人数\n",
    "n_at_most_50k = len(data[data['income']=='>50K'])\n",
    "\n",
    "# TODO：被调查者收入大于$50,000所占的比例\n",
    "greater_percent = float(n_at_most_50k) / float(n_records) * 100\n",
    "\n",
    "# 打印结果\n",
    "print \"Total number of records: {}\".format(n_records)\n",
    "print \"Individuals making more than $50,000: {}\".format(n_greater_50k)\n",
    "print \"Individuals making at most $50,000: {}\".format(n_at_most_50k)\n",
    "print \"Percentage of individuals making more than $50,000: {:.2f}%\".format(greater_percent)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "----\n",
    "## 准备数据\n",
    "在数据能够被作为输入提供给机器学习算法之前，它经常需要被清洗，格式化，和重新组织 - 这通常被叫做**预处理**。幸运的是，对于这个数据集，没有我们必须处理的无效或丢失的条目，然而，由于某一些特征存在的特性我们必须进行一定的调整。这个预处理都可以极大地帮助我们提升几乎所有的学习算法的结果和预测能力。\n",
    "\n",
    "### 获得特征和标签\n",
    "`income` 列是我们需要的标签，记录一个人的年收入是否高于50K。 因此我们应该把他从数据中剥离出来，单独存放。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 将数据切分成特征和对应的标签\n",
    "income_raw = data['income']\n",
    "features_raw = data.drop('income', axis = 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 转换倾斜的连续特征\n",
    "\n",
    "一个数据集有时可能包含至少一个靠近某个数字的特征，但有时也会有一些相对来说存在极大值或者极小值的不平凡分布的的特征。算法对这种分布的数据会十分敏感，并且如果这种数据没有能够很好地规一化处理会使得算法表现不佳。在人口普查数据集的两个特征符合这个描述：'`capital-gain'`和`'capital-loss'`。\n",
    "\n",
    "运行下面的代码单元以创建一个关于这两个特征的条形图。请注意当前的值的范围和它们是如何分布的。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x6670970>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 可视化 'capital-gain'和'capital-loss' 两个特征\n",
    "vs.distribution(features_raw)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对于高度倾斜分布的特征如`'capital-gain'`和`'capital-loss'`，常见的做法是对数据施加一个<a href=\"https://en.wikipedia.org/wiki/Data_transformation_(statistics)\">对数转换</a>，将数据转换成对数，这样非常大和非常小的值不会对学习算法产生负面的影响。并且使用对数变换显著降低了由于异常值所造成的数据范围异常。但是在应用这个变换时必须小心：因为0的对数是没有定义的，所以我们必须先将数据处理成一个比0稍微大一点的数以成功完成对数转换。\n",
    "\n",
    "运行下面的代码单元来执行数据的转换和可视化结果。再次，注意值的范围和它们是如何分布的。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xbc4b8d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 对于倾斜的数据使用Log转换\n",
    "skewed = ['capital-gain', 'capital-loss']\n",
    "features_raw[skewed] = data[skewed].apply(lambda x: np.log(x + 1))\n",
    "\n",
    "# 可视化对数转换后 'capital-gain'和'capital-loss' 两个特征\n",
    "vs.distribution(features_raw, transformed = True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 规一化数字特征\n",
    "除了对于高度倾斜的特征施加转换，对数值特征施加一些形式的缩放通常会是一个好的习惯。在数据上面施加一个缩放并不会改变数据分布的形式（比如上面说的'capital-gain' or 'capital-loss'）；但是，规一化保证了每一个特征在使用监督学习器的时候能够被平等的对待。注意一旦使用了缩放，观察数据的原始形式不再具有它本来的意义了，就像下面的例子展示的。\n",
    "\n",
    "运行下面的代码单元来规一化每一个数字特征。我们将使用[`sklearn.preprocessing.MinMaxScaler`](http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.MinMaxScaler.html)来完成这个任务。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>age</th>\n",
       "      <th>workclass</th>\n",
       "      <th>education_level</th>\n",
       "      <th>education-num</th>\n",
       "      <th>marital-status</th>\n",
       "      <th>occupation</th>\n",
       "      <th>relationship</th>\n",
       "      <th>race</th>\n",
       "      <th>sex</th>\n",
       "      <th>capital-gain</th>\n",
       "      <th>capital-loss</th>\n",
       "      <th>hours-per-week</th>\n",
       "      <th>native-country</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.30137</td>\n",
       "      <td>State-gov</td>\n",
       "      <td>Bachelors</td>\n",
       "      <td>0.8</td>\n",
       "      <td>Never-married</td>\n",
       "      <td>Adm-clerical</td>\n",
       "      <td>Not-in-family</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>0.02174</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.397959</td>\n",
       "      <td>United-States</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       age   workclass education_level  education-num  marital-status  \\\n",
       "0  0.30137   State-gov       Bachelors            0.8   Never-married   \n",
       "\n",
       "      occupation    relationship    race    sex  capital-gain  capital-loss  \\\n",
       "0   Adm-clerical   Not-in-family   White   Male       0.02174           0.0   \n",
       "\n",
       "   hours-per-week  native-country  \n",
       "0        0.397959   United-States  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.preprocessing import MinMaxScaler\n",
    "\n",
    "# 初始化一个 scaler，并将它施加到特征上\n",
    "scaler = MinMaxScaler()\n",
    "numerical = ['age', 'education-num', 'capital-gain', 'capital-loss', 'hours-per-week']\n",
    "features_raw[numerical] = scaler.fit_transform(data[numerical])\n",
    "\n",
    "# 显示一个经过缩放的样例记录\n",
    "display(features_raw.head(n = 1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 练习：数据预处理\n",
    "\n",
    "从上面的**数据探索**中的表中，我们可以看到有几个属性的每一条记录都是非数字的。通常情况下，学习算法期望输入是数字的，这要求非数字的特征（称为类别变量）被转换。转换类别变量的一种流行的方法是使用**独热编码**方案。独热编码为每一个非数字特征的每一个可能的类别创建一个_“虚拟”_变量。例如，假设`someFeature`有三个可能的取值`A`，`B`或者`C`，。我们将把这个特征编码成`someFeature_A`, `someFeature_B`和`someFeature_C`.\n",
    "\n",
    "| 特征X |                    | 特征X_A | 特征X_B | 特征X_C |\n",
    "| :-: |                            | :-: | :-: | :-: |\n",
    "|  B  |  | 0 | 1 | 0 |\n",
    "|  C  | ----> 独热编码 ----> | 0 | 0 | 1 |\n",
    "|  A  |  | 1 | 0 | 0 |\n",
    "\n",
    "此外，对于非数字的特征，我们需要将非数字的标签`'income'`转换成数值以保证学习算法能够正常工作。因为这个标签只有两种可能的类别（\"<=50K\"和\">50K\"），我们不必要使用独热编码，可以直接将他们编码分别成两个类`0`和`1`，在下面的代码单元中你将实现以下功能：\n",
    " - 使用[`pandas.get_dummies()`](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.get_dummies.html?highlight=get_dummies#pandas.get_dummies)对`'features_raw'`数据来施加一个独热编码。\n",
    " - 将目标标签`'income_raw'`转换成数字项。\n",
    "   - 将\"<=50K\"转换成`0`；将\">50K\"转换成`1`。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "103 total features after one-hot encoding.\n",
      "['age', 'education-num', 'capital-gain', 'capital-loss', 'hours-per-week', 'workclass_ Federal-gov', 'workclass_ Local-gov', 'workclass_ Private', 'workclass_ Self-emp-inc', 'workclass_ Self-emp-not-inc', 'workclass_ State-gov', 'workclass_ Without-pay', 'education_level_ 10th', 'education_level_ 11th', 'education_level_ 12th', 'education_level_ 1st-4th', 'education_level_ 5th-6th', 'education_level_ 7th-8th', 'education_level_ 9th', 'education_level_ Assoc-acdm', 'education_level_ Assoc-voc', 'education_level_ Bachelors', 'education_level_ Doctorate', 'education_level_ HS-grad', 'education_level_ Masters', 'education_level_ Preschool', 'education_level_ Prof-school', 'education_level_ Some-college', 'marital-status_ Divorced', 'marital-status_ Married-AF-spouse', 'marital-status_ Married-civ-spouse', 'marital-status_ Married-spouse-absent', 'marital-status_ Never-married', 'marital-status_ Separated', 'marital-status_ Widowed', 'occupation_ Adm-clerical', 'occupation_ Armed-Forces', 'occupation_ Craft-repair', 'occupation_ Exec-managerial', 'occupation_ Farming-fishing', 'occupation_ Handlers-cleaners', 'occupation_ Machine-op-inspct', 'occupation_ Other-service', 'occupation_ Priv-house-serv', 'occupation_ Prof-specialty', 'occupation_ Protective-serv', 'occupation_ Sales', 'occupation_ Tech-support', 'occupation_ Transport-moving', 'relationship_ Husband', 'relationship_ Not-in-family', 'relationship_ Other-relative', 'relationship_ Own-child', 'relationship_ Unmarried', 'relationship_ Wife', 'race_ Amer-Indian-Eskimo', 'race_ Asian-Pac-Islander', 'race_ Black', 'race_ Other', 'race_ White', 'sex_ Female', 'sex_ Male', 'native-country_ Cambodia', 'native-country_ Canada', 'native-country_ China', 'native-country_ Columbia', 'native-country_ Cuba', 'native-country_ Dominican-Republic', 'native-country_ Ecuador', 'native-country_ El-Salvador', 'native-country_ England', 'native-country_ France', 'native-country_ Germany', 'native-country_ Greece', 'native-country_ Guatemala', 'native-country_ Haiti', 'native-country_ Holand-Netherlands', 'native-country_ Honduras', 'native-country_ Hong', 'native-country_ Hungary', 'native-country_ India', 'native-country_ Iran', 'native-country_ Ireland', 'native-country_ Italy', 'native-country_ Jamaica', 'native-country_ Japan', 'native-country_ Laos', 'native-country_ Mexico', 'native-country_ Nicaragua', 'native-country_ Outlying-US(Guam-USVI-etc)', 'native-country_ Peru', 'native-country_ Philippines', 'native-country_ Poland', 'native-country_ Portugal', 'native-country_ Puerto-Rico', 'native-country_ Scotland', 'native-country_ South', 'native-country_ Taiwan', 'native-country_ Thailand', 'native-country_ Trinadad&Tobago', 'native-country_ United-States', 'native-country_ Vietnam', 'native-country_ Yugoslavia']\n"
     ]
    }
   ],
   "source": [
    "# TODO：使用pandas.get_dummies()对'features_raw'数据进行独热编码\n",
    "features = pd.get_dummies(features_raw)\n",
    "\n",
    "# TODO：将'income_raw'编码成数字值\n",
    "income_match = {\"<=50K\":0,\">50K\":1}\n",
    "income = income_raw.apply(lambda x: income_match[x])\n",
    "\n",
    "# 打印经过独热编码之后的特征数量\n",
    "encoded = list(features.columns)\n",
    "print \"{} total features after one-hot encoding.\".format(len(encoded))\n",
    "\n",
    "# 移除下面一行的注释以观察编码的特征名字\n",
    "print encoded"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 混洗和切分数据\n",
    "现在所有的 _类别变量_ 已被转换成数值特征，而且所有的数值特征已被规一化。和我们一般情况下做的一样，我们现在将数据（包括特征和它们的标签）切分成训练和测试集。其中80%的数据将用于训练和20%的数据用于测试。然后再进一步把训练数据分为训练集和验证集，用来选择和优化模型。\n",
    "\n",
    "运行下面的代码单元来完成切分。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training set has 28941 samples.\n",
      "Validation set has 7236 samples.\n",
      "Testing set has 9045 samples.\n"
     ]
    }
   ],
   "source": [
    "# 导入 train_test_split\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "# 将'features'和'income'数据切分成训练集和测试集\n",
    "X_train, X_test, y_train, y_test = train_test_split(features, income, test_size = 0.2, random_state = 0,\n",
    "                                                    stratify = income)\n",
    "# 将'X_train'和'y_train'进一步切分为训练集和验证集\n",
    "X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.2, random_state=0,\n",
    "                                                    stratify = y_train)\n",
    "\n",
    "# 显示切分的结果\n",
    "print \"Training set has {} samples.\".format(X_train.shape[0])\n",
    "print \"Validation set has {} samples.\".format(X_val.shape[0])\n",
    "print \"Testing set has {} samples.\".format(X_test.shape[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "7236"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(y_val)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1793"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(y_val[y_val.values==1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "----\n",
    "## 评价模型性能\n",
    "在这一部分中，我们将尝试四种不同的算法，并确定哪一个能够最好地建模数据。四种算法包含一个*天真的预测器* 和三个你选择的监督学习器。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 评价方法和朴素的预测器\n",
    "*CharityML*通过他们的研究人员知道被调查者的年收入大于\\$50,000最有可能向他们捐款。因为这个原因*CharityML*对于准确预测谁能够获得\\$50,000以上收入尤其有兴趣。这样看起来使用**准确率**作为评价模型的标准是合适的。另外，把*没有*收入大于\\$50,000的人识别成年收入大于\\$50,000对于*CharityML*来说是有害的，因为他想要找到的是有意愿捐款的用户。这样，我们期望的模型具有准确预测那些能够年收入大于\\$50,000的能力比模型去**查全**这些被调查者*更重要*。我们能够使用**F-beta score**作为评价指标，这样能够同时考虑查准率和查全率：\n",
    "\n",
    "$$ F_{\\beta} = (1 + \\beta^2) \\cdot \\frac{precision \\cdot recall}{\\left( \\beta^2 \\cdot precision \\right) + recall} $$\n",
    "\n",
    "\n",
    "尤其是，当 $\\beta = 0.5$ 的时候更多的强调查准率，这叫做**F$_{0.5}$ score** （或者为了简单叫做F-score）。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 问题 1 - 天真的预测器的性能\n",
    "\n",
    "通过查看收入超过和不超过 \\$50,000 的人数，我们能发现多数被调查者年收入没有超过 \\$50,000。如果我们简单地预测说*“这个人的收入没有超过 \\$50,000”*，我们就可以得到一个 准确率超过 50% 的预测。这样我们甚至不用看数据就能做到一个准确率超过 50%。这样一个预测被称作是天真的。通常对数据使用一个*天真的预测器*是十分重要的，这样能够帮助建立一个模型表现是否好的基准。 使用下面的代码单元计算天真的预测器的相关性能。将你的计算结果赋值给`'accuracy'`, `‘precision’`, `‘recall’` 和 `'fscore'`，这些值会在后面被使用，请注意这里不能使用scikit-learn，你需要根据公式自己实现相关计算。\n",
    "\n",
    "*如果我们选择一个无论什么情况都预测被调查者年收入大于 \\$50,000 的模型，那么这个模型在**验证集上**的准确率，查准率，查全率和 F-score是多少？*  \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Naive Predictor on validation data: \n",
      "     Accuracy score: 0.2478 \n",
      "     Precision: 0.2478 \n",
      "     Recall: 1.0000 \n",
      "     F-score: 0.2917\n"
     ]
    }
   ],
   "source": [
    "#不能使用scikit-learn，你需要根据公式自己实现相关计算。\n",
    "\n",
    "#TODO： 计算准确率\n",
    "accuracy = float(len(y_val[y_val.values==1])) / float(len(y_val))\n",
    "\n",
    "# TODO： 计算查准率 Precision\n",
    "precision = float(len(y_val[y_val.values==1])) / float(len(y_val))\n",
    "\n",
    "# TODO： 计算查全率 Recall\n",
    "recall = 1\n",
    "\n",
    "# TODO： 使用上面的公式，设置beta=0.5，计算F-score\n",
    "fscore = (1 + 0.5**2)*(precision * recall)/(precision*0.5**2 + recall)\n",
    "\n",
    "# 打印结果\n",
    "print \"Naive Predictor on validation data: \\n \\\n",
    "    Accuracy score: {:.4f} \\n \\\n",
    "    Precision: {:.4f} \\n \\\n",
    "    Recall: {:.4f} \\n \\\n",
    "    F-score: {:.4f}\".format(accuracy, precision, recall, fscore)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 监督学习模型\n",
    "### 问题 2 - 模型应用\n",
    "\n",
    "你能够在 [`scikit-learn`](http://scikit-learn.org/stable/supervised_learning.html) 中选择以下监督学习模型\n",
    "- 高斯朴素贝叶斯 (GaussianNB)\n",
    "- 决策树 (DecisionTree)\n",
    "- 集成方法 (Bagging, AdaBoost, Random Forest, Gradient Boosting)\n",
    "- K近邻 (K Nearest Neighbors)\n",
    "- 随机梯度下降分类器 (SGDC)\n",
    "- 支撑向量机 (SVM)\n",
    "- Logistic回归（LogisticRegression）\n",
    "\n",
    "从上面的监督学习模型中选择三个适合我们这个问题的模型，并回答相应问题。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 模型1\n",
    "\n",
    "**模型名称**\n",
    "\n",
    "回答：\n",
    "\n",
    "Logistic回归（LogisticRegression）\n",
    "\n",
    "**描述一个该模型在真实世界的一个应用场景。（你需要为此做点研究，并给出你的引用出处）**\n",
    "\n",
    "回答：\n",
    "\n",
    "银行收集信贷客户的样本数据，运用逻辑回归模型分析客户的个人信用状况。（引用：《逻辑回归在个人信用评估模型上的运用》）\n",
    "\n",
    "**这个模型的优势是什么？他什么情况下表现最好？**\n",
    "\n",
    "回答：\n",
    "\n",
    "1.实现相对其他算法模型较为简单；\n",
    "2.分类时计算量小，运算速度快，资源占用低；\n",
    "3.可通过L2正则化来解决多重共线性问题；\n",
    "4.可处理稀疏高维特征数据；\n",
    "5.方便使用新数据进行模型的更新。\n",
    "\n",
    "**这个模型的缺点是什么？什么条件下它表现很差？**\n",
    "\n",
    "回答：\n",
    "\n",
    "1.模型本身的表达能力很弱，需要构造非常棒的特征组合才能达到好的效果；\n",
    "2.只能处理两分类问题，且必须线性可分；\n",
    "3.对于非线性特征需要进行转换。\n",
    "\n",
    "**根据我们当前数据集的特点，为什么这个模型适合这个问题。**\n",
    "\n",
    "回答：\n",
    "\n",
    "该模型可处理高维特征数据，且实现简单，当前数据集较多，运算速度快，虽然精度优势不高，但可用于做基准进行参考。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 模型2\n",
    "\n",
    "**模型名称**\n",
    "\n",
    "回答：\n",
    "\n",
    "Gradient Boosting\n",
    "\n",
    "**描述一个该模型在真实世界的一个应用场景。（你需要为此做点研究，并给出你的引用出处）**\n",
    "\n",
    "回答：\n",
    "\n",
    "Gradient Boosting模型可运用于健康体检数据中能够实现重大疾病筛查和早期诊断的目的。（案例来源：论文《基于Gradient Boosting算法的海量健康数据挖掘研究与应用》 ）\n",
    "\n",
    "**这个模型的优势是什么？他什么情况下表现最好？**\n",
    "\n",
    "回答：\n",
    "\n",
    "1.实现混合性数据类型的自然处理；\n",
    "2.预测精度高，预测能力强；\n",
    "3.健壮的输出控件；\n",
    "4.泛化能力强，不易发生overfitting的状况\n",
    "\n",
    "**这个模型的缺点是什么？什么条件下它表现很差？**\n",
    "\n",
    "回答：\n",
    "\n",
    "1.存在一定随机性、模型没有很强的稳定性；\n",
    "2.不适用于样本量过少的回归预测。\n",
    "\n",
    "**根据我们当前数据集的特点，为什么这个模型适合这个问题。**\n",
    "\n",
    "回答：\n",
    "\n",
    "一共有45222组样本，样本数足够多，该模型对precision要求较高，同时存在连续型数值及文本型数据。因此适用于Gradient Boosting模型。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 模型3\n",
    "\n",
    "**模型名称**\n",
    "\n",
    "回答：\n",
    "\n",
    "支持向量机 (SVM)\n",
    "\n",
    "**描述一个该模型在真实世界的一个应用场景。（你需要为此做点研究，并给出你的引用出处）**\n",
    "\n",
    "回答：\n",
    "\n",
    "SVM现实适合应用于渔业生产中通过观察水色的变化调控水质，以维持养殖水体生态系统中浮游植物、微生物、浮游动物等合理的动态平衡。（该案例来源与博文：支持向量机SVM算法原理及应用）\n",
    "\n",
    "**这个模型的优势是什么？他什么情况下表现最好？**\n",
    "\n",
    "回答：\n",
    "\n",
    "1.可以解决高维问题，即大型特征空间；\n",
    "2.能够处理非线性特征的相互作用；\n",
    "3.无需依赖整个数据；\n",
    "4.可提高泛化能力。\n",
    "\n",
    "当特征较多，特征之间存在一定关联性的状况下，SVM模型表现较为优秀。\n",
    "\n",
    "**这个模型的缺点是什么？什么条件下它表现很差？**\n",
    "\n",
    "回答：\n",
    "\n",
    "1.当样本数量很多的时候，模型效率并不是很高；\n",
    "2.对非线性问题没有通用的解决方案，有时很难找到合适的核函数；\n",
    "3.对于缺失数据较为敏感。\n",
    "\n",
    "当样本量很多，且存在较多的缺失数据时，模型整体的预测精度容易受影响。\n",
    "\n",
    "**根据我们当前数据集的特点，为什么这个模型适合这个问题。**\n",
    "\n",
    "回答：\n",
    "\n",
    "当前数据集一共有103组特征，维度较高，对数据shape观察，无缺失数据。预测准确度要求较高，因此SVM模型适用。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 练习 - 创建一个训练和预测的流水线\n",
    "为了正确评估你选择的每一个模型的性能，创建一个能够帮助你快速有效地使用不同大小的训练集并在验证集上做预测的训练和验证的流水线是十分重要的。\n",
    "你在这里实现的功能将会在接下来的部分中被用到。在下面的代码单元中，你将实现以下功能：\n",
    "\n",
    " - 从[`sklearn.metrics`](http://scikit-learn.org/stable/modules/classes.html#sklearn-metrics-metrics)中导入`fbeta_score`和`accuracy_score`。\n",
    " - 用训练集拟合学习器，并记录训练时间。\n",
    " - 对训练集的前300个数据点和验证集进行预测并记录预测时间。\n",
    " - 计算预测训练集的前300个数据点的准确率和F-score。\n",
    " - 计算预测验证集的准确率和F-score。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "# TODO：从sklearn中导入两个评价指标 - fbeta_score和accuracy_score\n",
    "from sklearn.metrics import fbeta_score, accuracy_score\n",
    "\n",
    "def train_predict(learner, sample_size, X_train, y_train, X_val, y_val): \n",
    "    '''\n",
    "    inputs:\n",
    "       - learner: the learning algorithm to be trained and predicted on\n",
    "       - sample_size: the size of samples (number) to be drawn from training set\n",
    "       - X_train: features training set\n",
    "       - y_train: income training set\n",
    "       - X_val: features validation set\n",
    "       - y_val: income validation set\n",
    "    '''\n",
    "    \n",
    "    results = {}\n",
    "    \n",
    "    # TODO：使用sample_size大小的训练数据来拟合学习器\n",
    "    # TODO: Fit the learner to the training data using slicing with 'sample_size'\n",
    "    start = time() # 获得程序开始时间\n",
    "    learner = learner.fit(X_train[:(sample_size)], y_train[:(sample_size)])\n",
    "    end = time() # 获得程序结束时间\n",
    "    \n",
    "    # TODO：计算训练时间\n",
    "    results['train_time'] = end - start\n",
    "    \n",
    "    # TODO: 得到在验证集上的预测值\n",
    "    #       然后得到对前300个训练数据的预测结果\n",
    "    start = time() # 获得程序开始时间\n",
    "    predictions_val = learner.predict(X_val)\n",
    "    predictions_train = learner.predict(X_train)\n",
    "    end = time() # 获得程序结束时间\n",
    "    \n",
    "    # TODO：计算预测用时\n",
    "    results['pred_time'] = end - start\n",
    "            \n",
    "    # TODO：计算在最前面的300个训练数据的准确率\n",
    "    results['acc_train'] = accuracy_score(y_train[:300],predictions_train[:300])\n",
    "        \n",
    "    # TODO：计算在验证上的准确率\n",
    "    results['acc_val'] = accuracy_score(y_val, predictions_val)\n",
    "    \n",
    "    # TODO：计算在最前面300个训练数据上的F-score\n",
    "    results['f_train'] = fbeta_score(y_train[:300], predictions_train[:300], beta=0.5)\n",
    "        \n",
    "    # TODO：计算验证集上的F-score\n",
    "    results['f_val'] = fbeta_score(y_val, predictions_val, beta=0.5)\n",
    "       \n",
    "    # 成功\n",
    "    print \"{} trained on {} samples.\".format(learner.__class__.__name__, sample_size)\n",
    "        \n",
    "    # 返回结果\n",
    "    return results"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 练习：初始模型的评估\n",
    "在下面的代码单元中，您将需要实现以下功能：             \n",
    "- 导入你在前面讨论的三个监督学习模型。             \n",
    "- 初始化三个模型并存储在`'clf_A'`，`'clf_B'`和`'clf_C'`中。\n",
    "  - 使用模型的默认参数值，在接下来的部分中你将需要对某一个模型的参数进行调整。             \n",
    "  - 设置`random_state`  (如果有这个参数)。       \n",
    "- 计算1%， 10%， 100%的训练数据分别对应多少个数据点，并将这些值存储在`'samples_1'`, `'samples_10'`, `'samples_100'`中\n",
    "\n",
    "**注意：**取决于你选择的算法，下面实现的代码可能需要一些时间来运行！"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "LogisticRegression trained on 289 samples.\n",
      "LogisticRegression trained on 2894 samples.\n",
      "LogisticRegression trained on 28941 samples.\n",
      "GradientBoostingClassifier trained on 289 samples.\n",
      "GradientBoostingClassifier trained on 2894 samples.\n",
      "GradientBoostingClassifier trained on 28941 samples.\n",
      "SVC trained on 289 samples.\n",
      "SVC trained on 2894 samples.\n",
      "SVC trained on 28941 samples.\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x157dd210>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# TODO：从sklearn中导入三个监督学习模型\n",
    "from sklearn.svm import SVC\n",
    "from sklearn.ensemble import GradientBoostingClassifier\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "# TODO：初始化三个模型\n",
    "clf_A = LogisticRegression(random_state=50)\n",
    "clf_B = GradientBoostingClassifier(random_state=50)\n",
    "clf_C = SVC(random_state=50)\n",
    "\n",
    "# TODO：计算1%， 10%， 100%的训练数据分别对应多少点\n",
    "samples_1 = int(0.01 * X_train.shape[0])\n",
    "samples_10 = int(0.1 * X_train.shape[0])\n",
    "samples_100 = int(1 * X_train.shape[0])\n",
    "\n",
    "# 收集学习器的结果\n",
    "results = {}\n",
    "for clf in [clf_A, clf_B, clf_C]:\n",
    "    clf_name = clf.__class__.__name__\n",
    "    results[clf_name] = {}\n",
    "    for i, samples in enumerate([samples_1, samples_10, samples_100]):\n",
    "        results[clf_name][i] = train_predict(clf, samples, X_train, y_train, X_val, y_val)\n",
    "\n",
    "# 对选择的三个模型得到的评价结果进行可视化\n",
    "vs.evaluate(results, accuracy, fscore)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "----\n",
    "## 提高效果\n",
    "\n",
    "在这最后一节中，您将从三个有监督的学习模型中选择 *最好的* 模型来使用学生数据。你将在整个训练集（`X_train`和`y_train`）上使用网格搜索优化至少调节一个参数以获得一个比没有调节之前更好的 F-score。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 问题 3 - 选择最佳的模型\n",
    "\n",
    "*基于你前面做的评价，用一到两段话向 *CharityML* 解释这三个模型中哪一个对于判断被调查者的年收入大于 \\$50,000 是最合适的。*             \n",
    "**提示：**你的答案应该包括评价指标，预测/训练时间，以及该算法是否适合这里的数据。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**回答：**\n",
    "\n",
    "如上最终结果呈现，无论是训练还是测试，logic regression模型的运算速度都是最快的，SVC模型运算时间相对长很多，而Gradient Boosting模型的运算速度相对还是较快；观察accuracy score和fscore的变化趋势都可以很明显的看出，不管训练集为1%，10%，100%任意情况，SVC的得分都是最低的，而Gradient Boosting得分都是最高的，而训练速度也在较高的水准，因此Gradient Boosting为三个算法中效果最佳的算法；\n",
    "\n",
    "我们可以观察到Gradient Boosting算法对应accuracy score当训练集达到10%以上，得分都高于基准值，但是测试的fcore都低于基准值，证明算法适用于该数据集，但是还需要通过调参来调整模型，提高fscore。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 问题 4 - 用通俗的话解释模型\n",
    "\n",
    "*用一到两段话，向 *CharityML* 用外行也听得懂的话来解释最终模型是如何工作的。你需要解释所选模型的主要特点。例如，这个模型是怎样被训练的，它又是如何做出预测的。避免使用高级的数学或技术术语，不要使用公式或特定的算法名词。*"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**回答： ** \n",
    "\n",
    "Gradient Boosting模型就是使用数据训练出简单模型，首先使用第一个模型生成预测值，和实际值进行比较，将二者的差异记录下来，并把这个差异值给第二个模型生成预测值，再与实际值进行比较，将差异记录，这样不断改进到差异值降到理想范围。最后将所有模型结合起来就是最终要的模型了。该模型进行预测是通过所有简单模型进行预测按照训练产生的权重进行最终的预测。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 练习：模型调优\n",
    "调节选择的模型的参数。使用网格搜索（GridSearchCV）来至少调整模型的重要参数（至少调整一个），这个参数至少需尝试3个不同的值。你要使用整个训练集来完成这个过程。在接下来的代码单元中，你需要实现以下功能：\n",
    "\n",
    "- 导入[`sklearn.model_selection.GridSearchCV`](http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html) 和 [`sklearn.metrics.make_scorer`](http://scikit-learn.org/stable/modules/generated/sklearn.metrics.make_scorer.html).\n",
    "- 初始化你选择的分类器，并将其存储在`clf`中。\n",
    " - 设置`random_state` (如果有这个参数)。\n",
    "- 创建一个对于这个模型你希望调整参数的字典。\n",
    " - 例如: parameters = {'parameter' : [list of values]}。\n",
    " - **注意：** 如果你的学习器有 `max_features` 参数，请不要调节它！\n",
    "- 使用`make_scorer`来创建一个`fbeta_score`评分对象（设置$\\beta = 0.5$）。\n",
    "- 在分类器clf上用'scorer'作为评价函数运行网格搜索，并将结果存储在grid_obj中。\n",
    "- 用训练集（X_train, y_train）训练grid search object,并将结果存储在`grid_fit`中。\n",
    "\n",
    "**注意：** 取决于你选择的参数列表，下面实现的代码可能需要花一些时间运行！"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Unoptimized model\n",
      "------\n",
      "Accuracy score on validation data: 0.8708\n",
      "F-score on validation data: 0.7622\n",
      "\n",
      "Optimized Model\n",
      "------\n",
      "Final accuracy score on the validation data: 0.8758\n",
      "Final F-score on the validation data: 0.7636\n"
     ]
    }
   ],
   "source": [
    "# TODO：导入'GridSearchCV', 'make_scorer'和其他一些需要的库\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.metrics import make_scorer\n",
    "from sklearn.ensemble import GradientBoostingClassifier\n",
    "from sklearn.metrics import fbeta_score\n",
    "# TODO：初始化分类器\n",
    "clf = GradientBoostingClassifier(random_state=50)\n",
    "\n",
    "# TODO：创建你希望调节的参数列表\n",
    "parameters = {'n_estimators':[50,100,150],'max_depth':range(5,10)}\n",
    "\n",
    "# TODO：创建一个fbeta_score打分对象\n",
    "scorer = make_scorer(fbeta_score, beta=0.5)\n",
    "\n",
    "# TODO：在分类器上使用网格搜索，使用'scorer'作为评价函数\n",
    "grid_obj = GridSearchCV(clf, param_grid= parameters, scoring= scorer)\n",
    "\n",
    "# TODO：用训练数据拟合网格搜索对象并找到最佳参数\n",
    "grid_obj = grid_obj.fit(X_train, y_train)\n",
    "\n",
    "# 得到estimator\n",
    "best_clf = grid_obj.best_estimator_\n",
    "\n",
    "# 使用没有调优的模型做预测\n",
    "predictions = (clf.fit(X_train, y_train)).predict(X_val)\n",
    "best_predictions = best_clf.predict(X_val)\n",
    "\n",
    "# 汇报调参前和调参后的分数\n",
    "print \"Unoptimized model\\n------\"\n",
    "print \"Accuracy score on validation data: {:.4f}\".format(accuracy_score(y_val, predictions))\n",
    "print \"F-score on validation data: {:.4f}\".format(fbeta_score(y_val, predictions, beta = 0.5))\n",
    "print \"\\nOptimized Model\\n------\"\n",
    "print \"Final accuracy score on the validation data: {:.4f}\".format(accuracy_score(y_val, best_predictions))\n",
    "print \"Final F-score on the validation data: {:.4f}\".format(fbeta_score(y_val, best_predictions, beta = 0.5))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 问题 5 - 最终模型评估\n",
    "\n",
    "_你的最优模型在测试数据上的准确率和 F-score 是多少？这些分数比没有优化的模型好还是差？你优化的结果相比于你在**问题 1**中得到的天真预测器怎么样？_  \n",
    "**注意：**请在下面的表格中填写你的结果，然后在答案框中提供讨论。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 结果:\n",
    " \n",
    "| 评价指标         | 天真预测器           | 未优化的模型        | 优化的模型        |\n",
    "| :------------: | :-----------------: | :---------------: | :-------------: | \n",
    "| 准确率          |         0.2478            |         0.8708          |         0.8758        |\n",
    "| F-score        |          0.2917           |            0.7622       |          0.7636       |"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**回答：**\n",
    "\n",
    "- 最优模型的准确率为0.8758、F-Score是0.7636，两个指标相比未优化的模型均有略微的提升。优化的结果相比天真预测器均有了很大的提升。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "----\n",
    "## 特征的重要性\n",
    "\n",
    "在数据上（比如我们这里使用的人口普查的数据）使用监督学习算法的一个重要的任务是决定哪些特征能够提供最强的预测能力。专注于少量的有效特征和标签之间的关系，我们能够更加简单地理解这些现象，这在很多情况下都是十分有用的。在这个项目的情境下这表示我们希望选择一小部分特征，这些特征能够在预测被调查者是否年收入大于\\$50,000这个问题上有很强的预测能力。\n",
    "\n",
    "选择一个有 `'feature_importance_'` 属性的scikit学习分类器（例如 AdaBoost，随机森林）。`'feature_importance_'` 属性是对特征的重要性排序的函数。在下一个代码单元中用这个分类器拟合训练集数据并使用这个属性来决定人口普查数据中最重要的5个特征。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 问题 6 - 观察特征相关性\n",
    "\n",
    "当**探索数据**的时候，它显示在这个人口普查数据集中每一条记录我们有十三个可用的特征。             \n",
    "_在这十三个记录中，你认为哪五个特征对于预测是最重要的，选择每个特征的理由是什么？你会怎样对他们排序？_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**回答：**\n",
    "- 特征1:education_level，教育程度的不同一定程度影响其从事岗位，也影响到其薪金水平；\n",
    "- 特征2:occupation，不同职业的薪资水平存在差异；\n",
    "- 特征3:capital-gain，资本获利的不同，很大程度反应受访者的生活水平；\n",
    "- 特征4:capital-loss，资本损失高的人，表现其生活水平也存在一定问题，捐献的概率相对也更低；\n",
    "- 特征5:workclass，工作状况也很大程度可以反应捐献能力，Without-pay、Never-worked的受访者相对捐献概率也会低\n",
    "- 排序情况：重要程度从高到低workclass,capital-gain,capital-loss,education_level,occupation"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 练习 - 提取特征重要性\n",
    "\n",
    "选择一个`scikit-learn`中有`feature_importance_`属性的监督学习分类器，这个属性是一个在做预测的时候根据所选择的算法来对特征重要性进行排序的功能。\n",
    "\n",
    "在下面的代码单元中，你将要实现以下功能：\n",
    " - 如果这个模型和你前面使用的三个模型不一样的话从sklearn中导入一个监督学习模型。\n",
    " - 在整个训练集上训练一个监督学习模型。\n",
    " - 使用模型中的 `'feature_importances_'`提取特征的重要性。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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ZmZmZhXGCaCZmZlZhWmXfQDNbP314YcfUlNTw+LFi9d1KNYMnTt3prq6mg022GBdh2Jma8EJoJmVVU1NDZttthk9e/ZE0roOx5ogIliwYAE1NTXsuOOO6zocM1sLbgI2s7JavHgxXbt2dfLXBkmia9eurr01awecAJpZ2Tn5a7u878zaByeAZmZmZhXGCeB6avz48fTt25fevXszYsSIOvMnTJjAwIEDqaqq4vbbb68z/5133mH77bfnnHPOKUe4Zs2m0WrRv8bo2LEjAwYMWPk3e/bsJsf91ltvcc011zR5ucaICLbaaisWLlwIwKuvvookHnnkkZVlunXrxoIFC+pdx7hx40qeOwo99NBDHHHEESXnXXXVVbz//vvNiN7M2gIngOuh5cuXc/bZZ3PvvfcyY8YMbr31VmbMmLFamR122IFRo0Zx/PHHl1zHj370Iw488MByhGvW5my00UY89dRTK/+a89ORzU0Aly9f3mAZSey9995MmjQJgIkTJ/Lxj3+ciRMnAvD888+z1VZb0bVr13rXMXToUC688MImx1fLCaBZ++YEcD00efJkevfuTa9evejUqRPDhg3jrrvuWq1Mz5496d+/Px061N2F06ZN4/XXX+eQQw4pV8hmbd7y5cu54IILGDx4MP379+faa68FYNGiRRx00EEMHDiQ3XfffeVn8cILL+TFF19kwIABXHDBBXVq08455xxGjRoFpM/rxRdfzCc/+UnGjh3Liy++yKGHHsqee+7J/vvvz3PPPVcnnv32229lwjdx4kS+853vrJYQfuITnwBg/vz5fPGLX2Tw4MEMHjyYRx99FIBRo0atbAF48cUX2WeffRg8eDDDhw9n0003XbmdRYsWcfTRR7PLLrtwwgknEBH8+te/Zt68eXz605/m05/+dEu+zWa2nnACuB6aO3cuPXr0WPm8urqauXPnNmrZFStWcN5553H55Ze3Vnhmbd4HH3ywsvn3qKOOAuD6669n8803Z8qUKUyZMoXf/e53zJo1i86dO3PnnXfyxBNP8OCDD3LeeecREYwYMYKddtqJp556qlGft86dO/PII48wbNgwzjjjDH7zm98wbdo0rrjiCs4666w65T/xiU+sTAAnT57M5z//eebMmQOkBHC//fYD4Nxzz+Xb3/42U6ZM4Y477uD000+vs65zzz2Xc889lylTptC9e/fV5j355JNcddVVzJgxg5deeolHH32Ub37zm3Tv3p0HH3yQBx98sGlvrpm1Cb4P4HooIupMa+zIu2uuuYbPfvazqyWQZra62ibgQvfffz/PPPPMyj61b7/9Ni+88ALV1dV8//vfZ8KECXTo0IG5c+fy+uuvN3mbxx13HJBq3CZOnMgxxxyzct6SJUvqlN9rr7148sknee+99/jwww/ZdNNN6dWrFzNnzmTixImcd955ADzwwAOrdRF55513ePfdd1db16RJk/jzn/8MwPHHH8/555+/2naqq6sBVvaH/OQnP9nk12dmbYsTwPVQdXX1yit9SDfOLb5qr8+kSZN4+OGHueaaa1i0aBFLly5l0003bbAzuFmliwh+85vfMGTIkNWmjxo1ivnz5zNt2jQ22GADevbsWfI+eFVVVaxYsWLl8+Iym2yyCZBq6bt06VInAS228cYb07t3b2644QYGDhwIwD777MM999zDG2+8Qd++fVeub9KkSWy00UZNf9HAhhtuuPJxx44dWbZsWbPWY2Zti5uA10ODBw/mhRdeYNasWSxdupQxY8YwdOjQRi17yy238MorrzB79myuuOIKTj75ZCd/Zo0wZMgQ/ud//ocPP/wQgH//+9+89957vP3222y99dZssMEGPPjgg7z88ssAbLbZZqvVtH30ox9lxowZLFmyhLfffpu///3vJbfzkY98hB133JGxY8cCKfF8+umnS5bdb7/9uOqqq9h3330B2HffffnVr37FPvvss7JV4JBDDmHkyJErlymVWO6zzz7ccccdAIwZM6ZR70fx6zOz9sU1gOuhqqoqRo4cyZAhQ1i+fDlf+cpX6NevH8OHD2fQoEEMHTqUKVOmcNRRR7Fw4UL+8pe/8OMf/5jp06ev69DNmixOqdvlYV04/fTTmT17NgMHDiQi6NatG3/+85854YQT+NznPsegQYMYMGAAu+yyCwBdu3Zlv/3242Mf+xiHHXYYl19+Occeeyz9+/enT58+fPzjH693W7fccgtf//rXufTSS/nwww8ZNmwYe+yxR51y++23H7/61a9WJoADBw6kpqZmtX5+v/71rzn77LPp378/y5Yt44ADDuC3v/3tauu56qqrOPHEE/nFL37B4Ycfzuabb97g+3HGGWdw2GGHsd1227kfoFk7pFL9zdq6QYMGxdSpU9d1GGZWwrPPPsuuu+66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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xc3c8a70>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# TODO：导入一个有'feature_importances_'的监督学习模型\n",
    "from sklearn.ensemble import GradientBoostingClassifier\n",
    "# TODO：在训练集上训练一个监督学习模型\n",
    "model = GradientBoostingClassifier()\n",
    "model = model.fit(X_train, y_train)\n",
    "\n",
    "# TODO： 提取特征重要性\n",
    "importances = model.feature_importances_\n",
    "\n",
    "# 绘图\n",
    "vs.feature_plot(importances, X_train, y_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 问题 7 - 提取特征重要性\n",
    "观察上面创建的展示五个用于预测被调查者年收入是否大于\\$50,000最相关的特征的可视化图像。\n",
    "\n",
    "_这五个特征的权重加起来是否超过了0.5?_<br>\n",
    "_这五个特征和你在**问题 6**中讨论的特征比较怎么样？_<br>\n",
    "_如果说你的答案和这里的相近，那么这个可视化怎样佐证了你的想法？_<br>\n",
    "_如果你的选择不相近，那么为什么你觉得这些特征更加相关？_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**回答：**\n",
    "1. 这五个特征的权重加起来等于0.6，超过了0.5；\n",
    "2. 和问题6讨论的特征相比capital-gain,capital-loss，education-num吻合；\n",
    "3. 可视化结果基本验证了对capital-gain,capital-loss，education-num重要性的判断，相对于age的重要程度出现了偏差，因为现实生活中不同行业薪资的差异及对不同年龄间薪资的差异未发现绝对的关系，导致出现不同的判断。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 特征选择\n",
    "\n",
    "如果我们只是用可用特征的一个子集的话模型表现会怎么样？通过使用更少的特征来训练，在评价指标的角度来看我们的期望是训练和预测的时间会更少。从上面的可视化来看，我们可以看到前五个最重要的特征贡献了数据中**所有**特征中超过一半的重要性。这提示我们可以尝试去**减小特征空间**，简化模型需要学习的信息。下面代码单元将使用你前面发现的优化模型，并**只使用五个最重要的特征**在相同的训练集上训练模型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Final Model trained on full data\n",
      "------\n",
      "Accuracy on validation data: 0.8758\n",
      "F-score on validation data: 0.7636\n",
      "\n",
      "Final Model trained on reduced data\n",
      "------\n",
      "Accuracy on validation data: 0.8666\n",
      "F-score on validation data: 0.7499\n"
     ]
    }
   ],
   "source": [
    "# 导入克隆模型的功能\n",
    "from sklearn.base import clone\n",
    "\n",
    "# 减小特征空间\n",
    "X_train_reduced = X_train[X_train.columns.values[(np.argsort(importances)[::-1])[:5]]]\n",
    "X_val_reduced = X_val[X_val.columns.values[(np.argsort(importances)[::-1])[:5]]]\n",
    "\n",
    "# 在前面的网格搜索的基础上训练一个“最好的”模型\n",
    "clf_on_reduced = (clone(best_clf)).fit(X_train_reduced, y_train)\n",
    "\n",
    "# 做一个新的预测\n",
    "reduced_predictions = clf_on_reduced.predict(X_val_reduced)\n",
    "\n",
    "# 对于每一个版本的数据汇报最终模型的分数\n",
    "print \"Final Model trained on full data\\n------\"\n",
    "print \"Accuracy on validation data: {:.4f}\".format(accuracy_score(y_val, best_predictions))\n",
    "print \"F-score on validation data: {:.4f}\".format(fbeta_score(y_val, best_predictions, beta = 0.5))\n",
    "print \"\\nFinal Model trained on reduced data\\n------\"\n",
    "print \"Accuracy on validation data: {:.4f}\".format(accuracy_score(y_val, reduced_predictions))\n",
    "print \"F-score on validation data: {:.4f}\".format(fbeta_score(y_val, reduced_predictions, beta = 0.5))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 问题 8 - 特征选择的影响\n",
    "\n",
    "*最终模型在只是用五个特征的数据上和使用所有的特征数据上的 F-score 和准确率相比怎么样？*  \n",
    "*如果训练时间是一个要考虑的因素，你会考虑使用部分特征的数据作为你的训练集吗？*"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**回答：**\n",
    "1. 只使用五个特征的数据建立模型的准确率及F-score和全数据模型相对有略微的下降，但如果将训练时间作为考虑因素，在准确率达到目标水平的情况下，考虑使用部分特征的数据作为训练集是更好的选择。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 问题 9 - 在测试集上测试你的模型\n",
    "\n",
    "终于到了测试的时候，记住，测试集只能用一次。\n",
    "\n",
    "*使用你最有信心的模型，在测试集上测试，计算出准确率和 F-score。*\n",
    "*简述你选择这个模型的原因，并分析测试结果*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy on testing data: 0.8569\n",
      "F-score on testing data: 0.7278\n"
     ]
    }
   ],
   "source": [
    "#TODO test your model on testing data and report accuracy and F score\n",
    "from sklearn.metrics import fbeta_score, accuracy_score\n",
    "X_test_reduced = X_test[X_test.columns.values[(np.argsort(importances)[::-1])[:5]]]\n",
    "test_predictions = clf_on_reduced.predict(X_test_reduced)\n",
    "test_accuracy = accuracy_score(y_test, test_predictions)\n",
    "test_fbetascore = fbeta_score(y_test, test_predictions, beta = 0.5)\n",
    "print \"Accuracy on testing data: {:.4f}\".format(test_accuracy)\n",
    "print \"F-score on testing data: {:.4f}\".format(test_fbetascore)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "使用该模型的原因为训练时间快，且准确率与全特征模型差异不大。测试集测试结果表现模型对未知数据的预测有85.7%准确性。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> **注意：** 当你写完了所有的代码，并且回答了所有的问题。你就可以把你的 iPython Notebook 导出成 HTML 文件。你可以在菜单栏，这样导出**File -> Download as -> HTML (.html)**把这个 HTML 和这个 iPython notebook 一起做为你的作业提交。"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
